#pragma once

#include <signal.h>
#include <unistd.h>
#include <iostream>
#include <cerrno>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void daemon()
{
    // 1.忽略异常信号
    signal(SIGPIPE, SIG_IGN); // 忽略收到SIGPIPE信号，而被操作系统终止
    signal(SIGCHLD, SIG_IGN); // 防止回收进程，导致阻塞，这里的两个信号是例子，具体用什么信号要看情况
    signal(SIGSEGV,SIG_IGN);

    // 2.让自己不要成为组长
    if (fork() > 0)
        exit(0);

    // 3.让自己成为话首进程
    pid_t id = setsid();
    if (id < 0)
    {
        std::cerr << "setsid fail" << std::endl;
        exit(1);
    }

    // 4.修改工作目录，可选，可不选
    chdir("/");

    // 5.处理后续0、1、2的问题
    int fd = open("/dev/null",O_WRONLY);
    if(fd < 0)
    {
        std::cerr << "open file fail" << std::endl;
        exit(1);
    }
    dup2(fd,0);
    dup2(fd,1);
    dup2(fd,2);
    close(fd);//打开的文件有引用计数，这里只是关闭4号文件描述符，由于该文件有0、1、2指向，所以该文件并不会被关闭
}

